keyof T
keyof Tで、TのpropertyのUnion型を取得できる
keyof Tを展開して見る
Tがrecordの時
code:TypeScript
type Person = { name: string; age: number; };
type A = keyof Person; // "name" | "age"
code:ts
type Hoge = { foo(): void; };
type A = keyof Hoge // foo
index signatureの時
code:ts
type Hoge = { key: string: void; };
type A = keyof Hoge // string | number
使用例
Pick<T, K extends keyof T>
Tがarray, tupleの時
中身のunionではなく、indexのunionになっていることに注意mrsekut.icon
code:ts
type tuple = readonly 'a', 'b', 'c', 'd';
type tupleKeys = keyof tuple;
const v1: tupleKeys = 'a'; // error. indexの話なのでerrorになる。わかる。
const t1: tupleKeys = 1; // ok. わかる
const t6: tupleKeys = 6; // ok. わからん. なぜか?
なぜ、tupleのときに、要素数を超えてもエラーにならないか?
これはkeyof tupleの中身を覗いたらわかるmrsekut.icon
type tupleKeys = keyof tuple;と書いただけじゃ中身が見えないが、
こう書くと見える
code:ts
type tuple = readonly 'a', 'b', 'c', 'd';
type A = { k in keyof tuple: 4 };
/**
* type A = {
* x: number: 4;
* readonly 0: 4;
* readonly 1: 4;
* readonly 2: 4;
* readonly 3: 4;
* length: 4;
* toString: 4;
* toLocaleString: 4;
* concat: 4;
* ... 19 more ...;
* Symbol.iterator: 4;
* }
*/
1行目の[x: number]のせいmrsekut.icon